home *** CD-ROM | disk | FTP | other *** search
/ AOL File Library: 2,801 to 2,900 / aol-file-protocol-4400-2801-to-2900.zip / AOLDLs / C++ Files Library / C++ Direct Buffer Access Code / Blitting.sit / Blitting Folder ƒ / MySprite ƒ / MySpriteMain.cp < prev    next >
Text File  |  1995-08-04  |  5KB  |  194 lines

  1. // MySpriteMain.cp, the main source file for MySprite. Used to test the Sprite
  2. //    classes. This runs in four main steps: (1) every object on the screen is
  3. //    moved; (2) every old posistion is erased; (3) the objects are drawn in their
  4. //    new posistions; and (4) the buffer is copied to the window.
  5. //
  6. // The purpose of this project is to show how the blitters can be used... while
  7. //    doing it, I found out (in profilings) that Duff's device isn't so hot, but
  8. //    bypassing CopyBits still is.
  9.  
  10. // copyright ⌐ 1995, Macneil Shonle. All rights reserved.
  11.  
  12. #include <InitToolbox.h>
  13. #include <SecureWindowRef.h>
  14. #include <SecureGWorld.h>
  15. #include <WindowAccessor.h>
  16. #include <GWorldAccessor.h>
  17. #include <Sprite.h>
  18. #include "ForegroundObject.h"
  19. #include <MacintoshIdioms.h>
  20. #include <GWorldSetter.h>
  21. #include <MMUModeSwapper.h>
  22.  
  23. #include <vector.h>
  24. #include <profiler.h>
  25.  
  26. void runProgram();
  27.  
  28. main()
  29. {
  30. #if __profile__
  31.     if (!ProfilerInit(collectDetailed, bestTimeBase, 80, 20)) {
  32. #endif
  33.     
  34.     try {
  35.         runProgram();
  36.     }
  37.     catch (xalloc& x) {
  38.         ::DebugStr68k("\pxalloc caught, try adding more memory");
  39.     }
  40.     catch (...) {
  41.         ::DebugStr68k("\punknown error occured");
  42.     }
  43.     
  44. #if __profile__
  45.         ProfilerDump( "\pUnrolled.prof" );
  46.         ProfilerTerm();
  47.     }
  48. #endif
  49.     
  50.     return 0;
  51. }
  52.  
  53. void ProfilerCopyBits(SecureMacPort& source, SecureMacPort& dest,
  54.     const Rect& sourceR, const Rect& destR)
  55. {
  56.     GWorldSetter setTo(dest.getMacPort(), dest.getMacGD());
  57.     
  58.     ::CopyBits(source.getBitMap(), dest.getBitMap(),
  59.         &sourceR, &destR, srcCopy, nil);
  60. }
  61.  
  62. void CopyImage(BufferAccessor& src, BufferAccessor& dest,
  63.     const Rect& srcR, const Rect& destR)
  64. {
  65.     FourPixelsPtr srcPtr = (FourPixelsPtr)src.getAddrOfPixel(srcR.left, srcR.top);
  66.     FourPixelsPtr destPtr = (FourPixelsPtr)dest.getAddrOfPixel(destR.left, destR.top);
  67.     PixelCord copyWidth = srcR.right - srcR.left;
  68.     PixelCord copyWidthDiv4 = copyWidth / 4;
  69.     PixelCord copyHeight = srcR.bottom - srcR.top;    
  70.     RowBytes srcRowSkip = src.getRowBytes() - copyWidth;
  71.     RowBytes destRowSkip = dest.getRowBytes() - copyWidth;
  72.     
  73.     MMUModeSwapper swapTo(src.use32Bit() | dest.use32Bit());
  74.     
  75.     for (PixelCord y=0; y<copyHeight; y++) {
  76.         for (PixelCord x=0; x<copyWidthDiv4; x++)
  77.             *destPtr++ = *srcPtr++;
  78.         
  79.         if (copyWidth & 01) {
  80.             *PixelPtr(destPtr) = *PixelPtr(srcPtr);
  81.             destPtr = FourPixelsPtr(PixelPtr(destPtr) + 1);
  82.             srcPtr = FourPixelsPtr(PixelPtr(srcPtr) + 1);
  83.         }
  84.         if (copyWidth & 02) {
  85.             *TwoPixelsPtr(destPtr) = *TwoPixelsPtr(srcPtr);
  86.             destPtr = FourPixelsPtr(PixelPtr(destPtr) + 2);
  87.             srcPtr = FourPixelsPtr(PixelPtr(srcPtr) + 2);
  88.         }
  89.         
  90.         srcPtr = FourPixelsPtr(PixelPtr(srcPtr) + srcRowSkip);
  91.         destPtr = FourPixelsPtr(PixelPtr(destPtr) + destRowSkip);
  92.     }
  93. }
  94.  
  95. // returns random number between [1...high], inclusive
  96. inline short RangeRandom(short high)
  97. {
  98.     short number = ::Random() % high;
  99.     number = (number < 0) ? -number : number;
  100.     return number + 1;
  101. }
  102.  
  103. void runProgram()
  104. {    
  105.     InitToolbox();
  106.     qd.randSeed = 1;                // random, but same for each launch. For "fair" profiling
  107.     
  108.     PixPatHandle ppat = ::GetPixPat(128);
  109.     CIconHandle ballCicn = ::GetCIcon(128);
  110.     if (ballCicn == 0) throw xalloc("GetCIcon failed", "runProgram");
  111.     CIconHandle redHoleCicn = ::GetCIcon(129);
  112.     if (redHoleCicn == 0) throw xalloc("GetCIcon failed", "runProgram");
  113.     
  114.     Rect bounds = {0, 0, 342, 512};
  115.     CenterRect(bounds, qd.screenBits.bounds);
  116.     
  117.     SecureWindowRef window(bounds, documentProc, "\pMySprite");
  118.     WindowAccessor windowBuff = window;
  119.     
  120.     SecureGWorld gworld(window.getPortRect());
  121.     GWorldAccessor gworldBuff = gworld;
  122.     
  123.     SecureGWorld virgin(window.getPortRect());
  124.     GWorldAccessor virginBuff = virgin;
  125.     
  126.     {
  127.         GWorldSetter setTo(virgin);
  128.         ::FillCRect(&virgin.getPortRect(), ppat);
  129.     }
  130.     
  131.     {
  132.         GWorldSetter setTo(gworld);
  133.         ProfilerCopyBits(virgin, gworld, virgin.getPortRect(), gworld.getPortRect());
  134.     }
  135.     
  136.     {
  137.         GWorldSetter setTo(window);
  138.         ProfilerCopyBits(gworld, window, gworld.getPortRect(), window.getPortRect());
  139.     }
  140.     
  141.     CIconSprite ballSprite(ballCicn);
  142.     CIconSprite redHoleSprite(redHoleCicn);
  143.     
  144.     const PixelCord kMaxVelocity = 7;
  145.     vector<BouncingObject*> ballVect(16, 0);
  146.     
  147.     for (int i=0; i<ballVect.size(); i++) {
  148.         Rect randomRect;
  149.         randomRect.left = RangeRandom(gworldBuff.getWidth() - ballSprite.getWidth());
  150.         randomRect.top = RangeRandom(gworldBuff.getHeight() - ballSprite.getHeight());
  151.         randomRect.right = randomRect.left + ballSprite.getWidth();
  152.         randomRect.bottom = randomRect.top + ballSprite.getHeight();
  153.         
  154.         ballVect[i] = new BouncingObject(ballSprite, randomRect,
  155.             RangeRandom(kMaxVelocity), RangeRandom(kMaxVelocity), kMaxVelocity+2);
  156.     }
  157.     
  158.     int numFrames = 6000;
  159.     
  160.     ::HideCursor();
  161.     {
  162.         GWorldSetter setTo(gworld);
  163.         
  164.         while (!::Button() && (--numFrames > 0)) {
  165.             for (int i=0; i<ballVect.size(); i++)
  166.                 ballVect[i]->move(gworldBuff);
  167.             
  168.             for (int i=0; i<ballVect.size(); i++)
  169.             //    ::ProfilerCopyBits(virgin, gworld,
  170.             //        ballVect[i]->getOldRect(), ballVect[i]->getOldRect());
  171.                 CopyImage(virginBuff, gworldBuff, ballVect[i]->getOldRect(),
  172.                     ballVect[i]->getOldRect());
  173.             
  174.             for (int i=0; i<ballVect.size(); i++)
  175.                 ballVect[i]->draw(gworldBuff);
  176.             
  177.             for (int i=0; i<ballVect.size(); i++) {
  178.                 Rect oldAndNew;
  179.                 ballVect[i]->getOldAndNew(oldAndNew);
  180.             //    ProfilerCopyBits(gworld, window, oldAndNew, oldAndNew);
  181.                 CopyImage(gworldBuff, windowBuff, oldAndNew, oldAndNew);
  182.             }
  183.         }
  184.     }
  185.     ::ShowCursor();
  186.     
  187.     for (int i=0; i<ballVect.size(); i++)
  188.         delete ballVect[i];
  189.     
  190.     ::DisposeCIcon(ballCicn);
  191.     ::DisposePixPat(ppat);
  192.     
  193.     ::FlushEvents(everyEvent, 0);
  194. }